package com.fucai.algorithm;

import cn.hutool.core.util.StrUtil;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * @description: 五码倍投算法
 * @author: zhuchi
 * @create: 2025-06-18 19:34
 * @Version 1.0
 **/
public class FiveAlgorithm {
    public static void main(String[] args) {
        System.out.println("---------------------------倍投收益最低153------------------------------");
        beitou(new BigDecimal("215"), new BigDecimal("20.00"), new BigDecimal("235.00"), 100, 3);

        System.out.println("---------------------------嘉奖倍投收益------------------------------");
        beitou(new BigDecimal("215"), new BigDecimal("20.00"), new BigDecimal("235.00"), 100, 3);

        System.out.println("---------------------------嘉奖倍投收益------------------------------");
        beitou(new BigDecimal("215"), new BigDecimal("20.00"), new BigDecimal("235.00"), 100, 2);
    }

    /**
     * 五码倍投算法
     * @param makeMoney 平均每期最低收益
     * @param oneMoney 1倍购买所需金额
     * @param zhongjiangMoney 1倍中奖金额
     * @param n n期不中后,不再要求收益,追本金
     * @param firstBuyBei 第一次购买倍数
     */
    public static void beitou(BigDecimal makeMoney, BigDecimal oneMoney, BigDecimal zhongjiangMoney, int n, int firstBuyBei){
        // 总支出
        BigDecimal totalZhichuMoney = new BigDecimal("0.00");

        // i代表购买次数
        for (int i = 1; i <= 10; i++){
            for (int j = 1; j <= 20000; j++){
                int buyBei = j;
                // n期不中后,不在要求收益,追本金
                if (i > n){
                    makeMoney = new BigDecimal("0.00");
                }

                // 第一次购买倍数不为1时,第一次按传入倍数购买
                if (i == 1 && firstBuyBei != 1){
                    buyBei = firstBuyBei;
                }

                // 倍投支出金额 = 1倍购买所需金额 * 购买倍数
                BigDecimal beitouZhichu = oneMoney.multiply(new BigDecimal(String.valueOf(buyBei)));
                // 中奖后收益金额
                BigDecimal zhongjiangShouyi = zhongjiangMoney.multiply(new BigDecimal(String.valueOf(buyBei)));

                // 平均每期收益 = （中奖后收益金额 - 倍投支出金额 - 总支出金额）/ 购买次数
                BigDecimal pingjunShouyi = zhongjiangShouyi.subtract(beitouZhichu).subtract(totalZhichuMoney);
                pingjunShouyi = pingjunShouyi.divide(new BigDecimal(String.valueOf(i)), 2, RoundingMode.HALF_UP);

                if (pingjunShouyi.compareTo(makeMoney) != -1){
                    totalZhichuMoney = totalZhichuMoney.add(beitouZhichu);
                    String log = StrUtil.format("第{}次购买,购买倍数{},花费{},总支出{},中奖后收益{},平均每期收益{}", i, buyBei, beitouZhichu, totalZhichuMoney, zhongjiangShouyi, pingjunShouyi);
                    System.out.println(log);
                    break;
                }
            }
        }
    }

}
